package card.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description: 纸牌工具类
 * @author: ly
 * @date: 2020/8/20 14:46
 */
public class CardUtil {

    /**
     * 点数转成花色
     *
     * @param card 点数
     * @return 花色
     */
    public static String pointToSuit(String card) {
        if ("11".equalsIgnoreCase(card)) {
            return "J";
        } else if ("12".equalsIgnoreCase(card)) {
            return "Q";
        } else if ("13".equalsIgnoreCase(card)) {
            return "K";
        } else if ("14".equalsIgnoreCase(card)) {
            return "A";
        } else if ("15".equalsIgnoreCase(card)) {
            return "2";
        } else if ("16".equalsIgnoreCase(card)) {
            return "小王";
        } else if ("17".equalsIgnoreCase(card)) {
            return "大王";
        }
        return card;
    }

    /**
     * 花色转成点数
     *
     * @param card 花色
     * @return 点数
     */
    public static String suitToPoint(String card) {
        if ("J".equalsIgnoreCase(card)) {
            return "11";
        } else if ("Q".equalsIgnoreCase(card)) {
            return "12";
        } else if ("K".equalsIgnoreCase(card)) {
            return "13";
        } else if ("A".equalsIgnoreCase(card)) {
            return "14";
        } else if ("2".equalsIgnoreCase(card)) {
            return "15";
        } else if ("小王".equalsIgnoreCase(card)) {
            return "16";
        } else if ("大王".equalsIgnoreCase(card)) {
            return "17";
        }
        return card;
    }

    /**
     * 点数替换成带花色的牌
     *
     * @param cards 纸牌点数
     * @return 转换后的结果
     */
    public static List<String> cardRepSuit(List<String> cards) {
        return cards.stream().map(CardUtil::pointToSuit).collect(Collectors.toList());
    }

    /**
     * 花色替换成带点数的牌
     *
     * @param cards 纸牌点数
     * @return 转换后的结果
     */
    public static List<String> cardRepPoint(List<String> cards) {
        return cards.stream().map(CardUtil::suitToPoint).collect(Collectors.toList());
    }

    /**
     * 排序
     *
     * @param cards 下发的纸牌
     * @return 排序后的点数
     */
    public static List<String> sort(List<String> cards) {
        List<String> pointList = cardRepPoint(cards);
        return pointList.stream().map(Integer::parseInt).sorted().map(String::valueOf).collect(Collectors.toList());
    }

    /**
     * 纸牌重组展示
     *
     * @param cards 下发的纸牌
     * @return 重组后的
     */
    public static List<String> cartRecomShow(List<String> cards) {
        return cardRepSuit(sort(cards));
    }

    /**
     * 出牌转换成可比较点数
     *
     * @param cards 打出的牌
     * @return 可比较点数
     */
    public static List<String> leaveConvert(String cards) {
        List<String> cardList = Arrays.stream(cards.split(" ")).filter(StringUtils::isNotBlank).collect(Collectors.toList());
        return cardRepPoint(sort(cardList));
    }

}
